分组后分组合计以及总计SQL语句(稍微整理了一下) | 您所在的位置:网站首页 › sql 分组查询 › 分组后分组合计以及总计SQL语句(稍微整理了一下) |
今天看到了这个文章感觉内容挺多的,就是比较乱,实在不好整理,脚本之家小编就简单整理了一下,希望大家能凑合看吧 分组后分组合计以及总计SQL语句 1)想一次性得到分组合计以及总计,sql: SELECT 分组字段 FROM 表 GROUP BY 分组字段 compute sum(COUNT(*)) 2)分组合计1: SELECT COUNT(*) FROM (SELECT 分组字段 FROM 表 GROUP BY 分组字段 )别名3)分组合计2: SELECT COUNT(*) FROM (SELECT distinct 分组字段 FROM 表)别名4)统计分组后的种类数: 例子1:分组合计 SELECT JSSKQK_JGH FROM SJ_JSSKQK WHERE JSSKQK_JGH IN (SELECT JSJBXX_JGH FROM SJ_JSJBXX WHERE JSJBXX_JSLXM1=1) GROUP BY JSSKQK_JGH HAVING ((SUM(JSSKQK_SSKCXS1) /40)>5)上面的语句已经可以满足要求分组了.假设执行后有3条记录,怎么才能把这个COUNT值求出? select count(*) from ( SELECT JSSKQK_JGH FROM SJ_JSSKQK WHERE JSSKQK_JGH IN (SELECT JSJBXX_JGH FROM SJ_JSJBXX WHERE JSJBXX_JSLXM1=1) GROUP BY JSSKQK_JGH HAVING ((SUM(JSSKQK_SSKCXS1) /40)>5) ) t例子2:[PL/SQL] 如何得到分组后,组中最大日期的纪录 TABLE:A A B C D 1 2001/01/01 1 1 1 2001/12/12 2 2 3 2002/01/01 3 3 3 2003/12/12 4 4 按列A分组,请问如何得到每组中时间最大的数据? 1 2001/12/12 2 2 3 2003/12/12 4 4 我的笨方法: SELECT * FROM A WHERE (A,B) IN( SELECT A,MAX(B) FROM A GROUP BY A )有更好的方法吗? 1,select * from a out where b = (select max(b) from a in where in.a = out.a) 2,Select * from (select a, row_number() over (partition by a order by b desc) rn from a) where rn=1 3,Select a, b,c,d from (select a, b,c,d,row_number() over (partition by a order by b desc) rn from a) where rn=1 4,select A,B,C,D from test where rowid in ( select rd from ( select rowid rd ,rank() over(partion A order by B desc)rk from test ) where rk=1 ) ) 例子3:SQL语句分组获取记录的第一条数据的方法 使用Northwind 数据库 首先查询Employees表 查询结果: city列里面只有5个城市 使用ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2) 先进行分组 注:根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). sql语句为: select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index from Employees 执行结果图: 可以看到是按照City分组,EmployeeID排序。 select出分组中的第一条记录 执行语句: select * from (select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index from Employees) a where a.new_index=1 执行结果图: 例子4:sql 获取分组结果后,如何每一组的第一条记录 Eric red 20 eric blue 30 andy red 10 andy blue 5 例如,只获取黑体的记录。 1,declare @fTable table (fName varchar(10), fColor varchar(10), fOrder int) insert into @fTable values('Eric', 'red', 20) insert into @fTable values('eric', 'blue', 30) insert into @fTable values('andy', 'red', 10) insert into @fTable values('andy', 'blue', 5) -- 只获取红色 select * from @fTable where fColor = 'red' -- 每个 fColor 取一条记录(按 fOrder 正序) select * from @fTable A where fName = (select top 1 fName from @fTable where fColor = A.fColor order by fOrder ) -- 每个 fColor 取一条记录(按 fOrder 反序) select * from @fTable A where fName = (select top 1 fName from @fTable where fColor = A.fColor order by fOrder desc) 2,SQL2005以上版本 select * from (select *,row=row_number()over(partition by Color order by Color) from table1)t where row=1 and color='xx'--加上條件 SQL2000用 top 1 例子5:一条SQL语句搞定分组并且每组限定记录集的数量 如果我想得到这样一个结果集:分组,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,只用一条SQL语句,该怎么写? 表[TScore]的结构 code 学号 char subject 科目 int score 成绩 int 可以这样写: SELECT [code] ,[subject] ,[score] FROM ( SELECT * ,RANK() OVER(PARTITION BY subject ORDER BY score DESC) AS Row FROM TScore ) AS a WHERE Row |
CopyRight 2018-2019 实验室设备网 版权所有 |